package com.ljx.thread.thread04;

import java.util.Arrays;

/**
 * @author LJX
 * @Description: 使用自动锁synchronized加锁和释放锁都是自动的,这样会解决掉线程不安全问题
 * @Date: 2022/11/1 15:12
 * @Version 1.0
 */
public class ThreadSafeTest2 {
	private static  String[] arr=new String[2];
	private static int index=0;
	/**
	 * 加上synchronized就是加了一把锁
	 * 而括号中填写的是（）多个线程共享的对象
	 * 括号里只要是多线程共享的那个对象就行。如下
	 * synchronized ("123"){
	 * 					if (arr[index]==null){
	 * 						arr[index]="word";
	 * 						index++;
	 *                                        }
	 */
	public static  Object lock=new Object();
	public static void main(String[] args) {

		Thread t1 = new Thread(new Runnable() {

			@Override
			public void run() {
				synchronized (lock){
					if (arr[index]==null){
						arr[index]="hello";
						index++;
					}
				}

			}
		});

		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (lock){
					if (arr[index]==null){
						arr[index]="word";
						index++;
					}
				}
			}
		});

		t1.start();
		t2.start();

		try {
			t1.join();
			t2.join();

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		/**
		 * 不能直接输出，因为打印在主线程上，主线程和t1,t2线程在争抢资源
		 * 所以我们要先合并到主线程，让t1,t2线程先执行完
		 */
		System.out.println(Arrays.toString(arr));
	}
}
